package bt.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import bt.excepcion.DAOExcepcion;
import bt.modelo.ExpectativaLaboral;
import bt.util.ConexionBD;

public class ExpectativaLaboralDAO extends BaseDAO {

	public void insertar(ExpectativaLaboral bt) throws DAOExcepcion {
		System.out.println("ExpectativaLaboralDAO: insertar(ExpectativaLaboral vo)");
		
		StringBuffer query = new StringBuffer("INSERT INTO expectativalaboral(idPostulante, idCargo, idTipoContrato, ");
		query.append("idJornadaLaboral, idArea, idPais, IdDepartamento, idMoneda, sueldo, observacion ) ");
		query.append(" VALUES (?,?,?,?,?,?,?,?,?,?) ");
		
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = (PreparedStatement) con.prepareStatement(query.toString());
			stmt.setInt(1, bt.getIdPostulante());
			stmt.setInt(2, bt.getIdCargo());
			stmt.setInt(3, bt.getIdTipoContrato());
			stmt.setInt(4, bt.getIdJornadaLaboral());
			stmt.setInt(5, bt.getIdArea());
			stmt.setInt(6, bt.getIdPais());
			stmt.setInt(7, bt.getIdDepartamento());
			stmt.setInt(8, bt.getIdMoneda());
			stmt.setDouble(9, bt.getSueldo());
			stmt.setString(10, bt.getObservacion());
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar en tabla de expectativa laboral.");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}
	
	public void actualizar(ExpectativaLaboral bt) throws DAOExcepcion {
		System.out.println("ExpectativaLaboralDAO: actualizar(ExpectativaLaboral vo)");
		
		StringBuffer query = new StringBuffer("update ExpectativaLaboral set idCargo=?, idTipoContrato=?, idJornadaLaboral=?, ");
		query.append("idArea=?, idPais=?, IdDepartamento=?, idMoneda=?, sueldo=?, observacion=? ");
		query.append(" where idExpectativaLaboral =?" );
		
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query.toString());
			stmt.setInt(1, bt.getIdCargo());
			stmt.setInt(2, bt.getIdTipoContrato());
			stmt.setInt(3, bt.getIdJornadaLaboral());
			stmt.setInt(4, bt.getIdArea());
			stmt.setInt(5, bt.getIdPais());
			stmt.setInt(6, bt.getIdDepartamento());
			stmt.setInt(7, bt.getIdMoneda());
			stmt.setDouble(8, bt.getSueldo());
			stmt.setString(9, bt.getObservacion());
			stmt.setInt(10, bt.getIdExpectativaLaboral());
			
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo actualizar la Expectativa Laboral.");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}
	
	public void eliminar(int idExpectativaLaboral) throws DAOExcepcion {
		System.out.println("ExpectativaLaboralDAO: eliminar(int idExpectativaLaboral)");
		String query = "DELETE FROM ExpectativaLaboral WHERE idExpectativaLaboral=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = (PreparedStatement) con.prepareStatement(query);
			stmt.setInt(1, idExpectativaLaboral);
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo eliminar la expectativa laboral.");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt); 
			this.cerrarConexion(con);
		}
	}
	
	public ExpectativaLaboral obtener(int idExpectativaLaboral) throws DAOExcepcion {
		System.out.println("ExpectativaLaboralDAO: obtener(int idExpectativaLaboral)");
		ExpectativaLaboral bt = new ExpectativaLaboral();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {		
			StringBuffer query = new StringBuffer("select a.idCargo, c.descripcion descargo, a.idTipoContrato, t.descripcion desTipoContrato, a.idJornadaLaboral, j.descripcion desjornadaLaboral, ");
			query.append("a.idArea, r.descripcion desarea, a.idPais, p.nombre desPais, a.IdDepartamento, d.nombre desDepartamento, a.idMoneda, ");
			query.append("m.descripcion desMoneda, a.sueldo, a.observacion, a.idExpectativaLaboral ");
			query.append("from expectativalaboral a, cargo c, tipocontrato t, jornadalaboral j, area r, pais p, departamento d, moneda m ");
			query.append("where a.idcargo = c.idcargo ");
			query.append(" and a.idtipocontrato = t.idtipocontrato ");
			query.append(" and a.idjornadalaboral = j.idjornadalaboral ");
			query.append(" and a.idarea = r.idarea ");
			query.append(" and a.idpais = p.idpais ");
			query.append(" and a.iddepartamento = d.iddepartamento ");
			query.append(" and a.idmoneda = m.idmoneda ");
			query.append(" and a.idExpectativaLaboral = ? ");
			
			con = ConexionBD.obtenerConexion();
			stmt = (PreparedStatement) con.prepareStatement(query.toString());
			stmt.setInt(1, idExpectativaLaboral);
			rs = stmt.executeQuery();
			if (rs.next()) {
				bt.setIdCargo(rs.getInt("idCargo"));
				bt.setDesCargo(rs.getString("descargo"));
				bt.setIdTipoContrato(rs.getInt("idTipoContrato"));
				bt.setDesTipoContrato(rs.getString("desTipoContrato"));				
				bt.setIdJornadaLaboral(rs.getInt("idJornadaLaboral"));
				bt.setDesJornadaLaboral(rs.getString("desJornadaLaboral"));
				bt.setIdArea(rs.getInt("idArea"));
				bt.setDesArea(rs.getString("desArea"));
				bt.setIdPais(rs.getInt("idPais"));
				bt.setDesPais(rs.getString("desPais"));
				bt.setIdDepartamento(rs.getInt("idDepartamento"));
				bt.setDesDepartamento(rs.getString("desDepartamento"));
				bt.setIdMoneda(rs.getInt("idMoneda"));
				bt.setDesMoneda(rs.getString("desMoneda"));
				bt.setSueldo(rs.getDouble("sueldo"));
				bt.setObservacion(rs.getString("observacion"));
				bt.setIdExpectativaLaboral(rs.getInt("idExpectativaLaboral"));
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return bt;
	}

	public Collection<ExpectativaLaboral> listarxPostulante(int idPostulante) throws DAOExcepcion {
		System.out.println("ExpectativaLaboralDAO: listar()");
		Collection<ExpectativaLaboral> lista = new ArrayList<ExpectativaLaboral>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			StringBuffer query = new StringBuffer("select a.idCargo, c.descripcion descargo, a.idTipoContrato, t.descripcion desTipoContrato, a.idJornadaLaboral, j.descripcion desjornadaLaboral, ");
			query.append("a.idArea, r.descripcion desarea, a.idPais, p.nombre desPais, a.IdDepartamento, d.nombre desDepartamento, a.idMoneda, ");
			query.append("m.descripcion desMoneda, a.sueldo, a.observacion, a.idExpectativaLaboral ");
			query.append("from expectativalaboral a, cargo c, tipocontrato t, jornadalaboral j, area r, pais p, departamento d, moneda m ");
			query.append("where a.idcargo = c.idcargo ");
			query.append(" and a.idtipocontrato = t.idtipocontrato ");
			query.append(" and a.idjornadalaboral = j.idjornadalaboral ");
			query.append(" and a.idarea = r.idarea ");
			query.append(" and a.idpais = p.idpais ");
			query.append(" and a.iddepartamento = d.iddepartamento ");
			query.append(" and a.idmoneda = m.idmoneda ");
			query.append("  and a.idPostulante = ? ");
			query.append("  order by a.fechaRegistro desc ");

			stmt = (PreparedStatement) con.prepareStatement(query.toString());
			stmt.setInt(1, idPostulante);
			rs = stmt.executeQuery();
			while (rs.next()) {
				ExpectativaLaboral bt = new ExpectativaLaboral();
				bt.setIdCargo(rs.getInt("idCargo"));
				bt.setDesCargo(rs.getString("descargo"));
				bt.setIdTipoContrato(rs.getInt("idTipoContrato"));
				bt.setDesTipoContrato(rs.getString("desTipoContrato"));				
				bt.setIdJornadaLaboral(rs.getInt("idJornadaLaboral"));
				bt.setDesJornadaLaboral(rs.getString("desJornadaLaboral"));
				bt.setIdArea(rs.getInt("idArea"));
				bt.setDesArea(rs.getString("desArea"));
				bt.setIdPais(rs.getInt("idPais"));
				bt.setDesPais(rs.getString("desPais"));
				bt.setIdDepartamento(rs.getInt("idDepartamento"));
				bt.setDesDepartamento(rs.getString("desDepartamento"));
				bt.setIdMoneda(rs.getInt("idMoneda"));
				bt.setDesMoneda(rs.getString("desMoneda"));
				bt.setSueldo(rs.getDouble("sueldo"));
				bt.setObservacion(rs.getString("observacion"));

				lista.add(bt);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return lista;
	}	
}